import axios from "axios"
import store from "@/store"
// 创建axios实例
const instance = axios.create({
    // 基本请求路径的抽取
    baseURL:"/api",
    // 这个时间是你每次请求的过期时间，这次请求认为20秒之后这个请求就是失败的
    timeout:20000
})

// 请求拦截器————拦截每一次请求
instance.interceptors.request.use(config=>{
    // 什么时候执行这个函数？？ 每一次请求发出去之前执行
    // config 本次请求的相关信息


    // console.log(config);

    // 这个函数里面要做什么？  可以做一些请求之前的准备工作，例如设置请求头，携带token
    // 设置请求头，我们先放一放，后面说
    // 如果用户是有登录的，请求就应该带上token值
    let token = localStorage.getItem("x-auth-token");
    if(token){
        // 添加请求头  
        config.headers["x-auth-token"] = token;

        // config.headers["aaa"] = "aaa的值";
    }
    // console.log(config);
    // 必须返回config，才能真正发起请求
    return config
},err=>{
    return Promise.reject(err)
});

// 响应拦截器
instance.interceptors.response.use(res=>{
    // 什么时候执行这个函数？？ 后端返回数据，并且在组件内部接收到之前 执行这个函数
    // res 是？  是axios给我们封装的一个响应对象
    // res.data才是真正的后端给我们的数据
    // 这个函数的作用： 对后端给我们的数据可以进行统一处理
    // console.log("响应拦截器的res为：",res);
    // console.log("响应拦截器的res.data为：",res.data);

    // 业务失败的统一处理
    // arr是一个可通行的数组
    let arr = [0,400,407]
    // res.data.code在这个数组中要往下走，不进if
    // res.data.code不在这个数组，才进入if
    // if(res.data.code!==0 && res.data.code!==400 && res.data.code!==407){
    if(!arr.includes(res.data.code)){
        // 判断失败，提示用户失败了
        // alert(res.data.message)
        store.dispatch("handleToast/asyncChangeIsShowToast",{
            msg:res.data.message,
            type:"danger"
        })
        return false
    }

    // 依旧需要需要返回res对象，组件内部才能拿到这个res相关数据
    return res.data
},err=>{
    // console.log("1111111111111111111");
    // 请求失败的处理
    // alert(err)
    store.dispatch("handleToast/asyncChangeIsShowToast",{
        msg:err,
        type:"danger"
    })
    return Promise.reject(err)
})




export default instance